/*     */ package com.zimbra.cs.lmtpserver;
/*     */ 
/*     */ import java.io.IOException;
/*     */ import java.io.InputStream;
/*     */ import java.io.PushbackInputStream;
/*     */ import java.util.LinkedList;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class LmtpMessageInputStream
/*     */   extends InputStream
/*     */ {
/*     */   private static final int CR = 13;
/*     */   private static final int LF = 10;
/*     */   private PushbackInputStream mIn;
/*  50 */   private int mMessageSize = 0;
/*  51 */   private boolean mDone = false;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   private LinkedList<Integer> mPrefix;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*  61 */   private boolean mGotCR = true;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*  66 */   private boolean mGotLF = true;
/*     */   
/*     */   public LmtpMessageInputStream(InputStream in, String prefix) {
/*  69 */     this.mIn = new PushbackInputStream(in);
/*     */     
/*  71 */     if (prefix != null) {
/*  72 */       this.mPrefix = new LinkedList();
/*  73 */       byte[] bytes = prefix.getBytes();
/*  74 */       for (byte b : bytes) {
/*  75 */         this.mPrefix.add(Integer.valueOf(b));
/*     */       }
/*  77 */       this.mMessageSize = bytes.length;
/*     */     }
/*     */   }
/*     */   
/*     */   public int getMessageSize() {
/*  82 */     return this.mMessageSize;
/*     */   }
/*     */   
/*     */   public int available() throws IOException
/*     */   {
/*  87 */     if (this.mDone) {
/*  88 */       return 0;
/*     */     }
/*  90 */     return this.mIn.available();
/*     */   }
/*     */   
/*     */   public int read() throws IOException
/*     */   {
/*  95 */     if (this.mDone) {
/*  96 */       return -1;
/*     */     }
/*     */     
/*     */ 
/* 100 */     if (this.mPrefix != null) {
/* 101 */       if (this.mPrefix.size() > 0) {
/* 102 */         return ((Integer)this.mPrefix.remove()).intValue();
/*     */       }
/* 104 */       this.mPrefix = null;
/*     */     }
/*     */     
/*     */ 
/*     */ 
/* 109 */     int c = this.mIn.read();
/* 110 */     if (c == -1) {
/* 111 */       this.mDone = true;
/* 112 */       throw new IOException("End of stream encountered when looking for <CR><LF>.<CR><LF>");
/*     */     }
/*     */     
/* 115 */     if (c == 13) {
/* 116 */       this.mGotCR = true;
/* 117 */       this.mGotLF = false;
/* 118 */       this.mMessageSize += 1;
/* 119 */       return c;
/*     */     }
/* 121 */     if (c == 10) {
/* 122 */       if (this.mGotCR) {
/* 123 */         this.mGotLF = true;
/*     */       }
/* 125 */       this.mMessageSize += 1;
/* 126 */       return c;
/*     */     }
/* 128 */     if ((!this.mGotCR) || (!this.mGotLF)) {
/* 129 */       this.mGotCR = false;
/* 130 */       this.mGotLF = false;
/* 131 */       this.mMessageSize += 1;
/* 132 */       return c;
/*     */     }
/*     */     
/*     */ 
/* 136 */     if (c != 46) {
/* 137 */       this.mGotCR = false;
/* 138 */       this.mGotLF = false;
/* 139 */       this.mMessageSize += 1;
/* 140 */       return c;
/*     */     }
/*     */     
/*     */ 
/* 144 */     c = this.mIn.read();
/* 145 */     if (c == -1) {
/* 146 */       this.mDone = true;
/* 147 */       throw new IOException("End of stream encountered after '.' when looking for '<CR><LF>'");
/*     */     }
/* 149 */     if (c != 13)
/*     */     {
/* 151 */       this.mGotCR = false;
/* 152 */       this.mGotLF = false;
/* 153 */       this.mMessageSize += 1;
/* 154 */       return c;
/*     */     }
/*     */     
/*     */ 
/* 158 */     c = this.mIn.read();
/* 159 */     if (c == -1) {
/* 160 */       this.mDone = true;
/* 161 */       throw new IOException("End of stream encountered after '<CR><LF>.<CR>' when looking for '<LF>'");
/*     */     }
/* 163 */     if (c != 10)
/*     */     {
/* 165 */       this.mIn.unread(c);
/* 166 */       this.mGotCR = true;
/* 167 */       this.mGotLF = false;
/* 168 */       this.mMessageSize += 1;
/* 169 */       return 13;
/*     */     }
/*     */     
/*     */ 
/* 173 */     this.mDone = true;
/* 174 */     return -1;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public int read(byte[] b, int off, int len)
/*     */     throws IOException
/*     */   {
/* 190 */     if (b == null)
/* 191 */       throw new NullPointerException();
/* 192 */     if ((off < 0) || (len < 0) || (len > b.length - off))
/* 193 */       throw new IndexOutOfBoundsException();
/* 194 */     if (len == 0) {
/* 195 */       return 0;
/*     */     }
/*     */     
/* 198 */     int c = read();
/* 199 */     if (c == -1) {
/* 200 */       return -1;
/*     */     }
/* 202 */     b[off] = ((byte)c);
/*     */     
/* 204 */     for (int i = 1; 
/* 205 */         i < len; i++) {
/* 206 */       c = read();
/* 207 */       if (c == -1) {
/*     */         break;
/*     */       }
/* 210 */       b[(off + i)] = ((byte)c);
/*     */     }
/* 212 */     return i;
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/lmtpserver/LmtpMessageInputStream.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */